/*
 * ProtocoloPeer.h
 *
 *  Created on: Jun 16, 2009
 *      Author: joephantom
 */

#ifndef PROTOCOLOPEER_H_
#define PROTOCOLOPEER_H_

#include <arpa/inet.h>
#include <string.h>
#include <vector>
#include <list>

#include "Protocolo.h"
#include "Respuesta.h"
#include "RespuestaBitField.h"
#include "RespuestaTengo.h"
#include "RespuestaBloque.h"
#include "RespuestaPedido.h" //incluir en el .cpp y no en el h todos los respuesta
#include "RespuestaCancelar.h"
#include <math.h>

class ProtocoloPeer: public Protocolo
{
public:
	ProtocoloPeer();//TODO ver como pasar la cantidad de piezas para el bitfield
	virtual ~ProtocoloPeer();

	string mantenerVivo();
	string choke();
	string unchoke();
	string interesado();
	string noInteresado();
	string tengo(const unsigned long int indicePieza);
	string bitfield(const list<unsigned long int> &piezas, const unsigned long int cantidadPiezas);
	string pedido(const unsigned long int indicePieza, const unsigned long int offsetPieza, const unsigned long int longitud);
	string pieza(const unsigned long int indicePieza, const unsigned long int offsetPieza, const string &informacion);
	string cancelar(const unsigned long int indicePieza, const unsigned long int offsetPieza, const unsigned long int longitud);

	virtual Respuesta* procesar(const string &s) const;

private:
	string deBitfieldAstring(const list<unsigned long int> &list, unsigned long int cantPiezas) const;
};

#endif /* PROTOCOLOPEER_H_ */
